package laborum2011.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import laborum2011.excepcion.DAOExcepcion;
import laborum2011.modelo.Empresa;
import laborum2011.util.ConexionBD;

public class EmpresaDAO extends BaseDAO {

	public Collection<Empresa> buscarPorRasonSocial(String nombre) throws DAOExcepcion {
		System.out.println("EmpresaDAO: buscarPorNombre(String nombre)");
		String query = "SELECT id_empresa, id_contacto, razon_social, RUC, desc_negocio, direccion, telefono, web, " 
			          +"correo, estado, rubro " 
			          +"FROM empresa WHERE estado = 1 and razon_social like ?";
		Collection<Empresa> lista = new ArrayList<Empresa>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Empresa vo = new Empresa();
				vo.setId_empresa(rs.getInt("id_empresa"));
				vo.setId_contacto(rs.getInt("id_contacto"));
				vo.setRazon_social(rs.getString("rason_social"));
				vo.setRUC(rs.getString("RUC"));
				vo.setDesc_negocio(rs.getString("desc_negocio"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setWeb(rs.getString("web"));
				vo.setCorreo(rs.getString("correo"));
				vo.setEstado(rs.getInt("Estado"));
				vo.setRubro(rs.getString("rubro"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public void insertar(Empresa po) throws DAOExcepcion {

		System.out.println("EmpresaDAO: insertar(Empresa po)");
		String query = "INSERT INTO empresa(id_contacto, razon_social, RUC, desc_negocio, direccion, telefono, web, correo, estado, rubro) " 
					  +	"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
		Connection con = null;
		PreparedStatement stmt = null;

		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, po.getId_contacto());
			stmt.setString(2, po.getRazon_social());
			stmt.setString(3, po.getRUC());
			stmt.setString(4, po.getDesc_negocio());
			stmt.setString(5, po.getDireccion());
			stmt.setString(6, po.getTelefono());
			stmt.setString(7, po.getWeb());
			stmt.setString(8, po.getCorreo());
			stmt.setInt(9, po.getEstado());
			stmt.setString(10, po.getRubro());

			int i = stmt.executeUpdate();

			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}	
	

	public Empresa obtenerPorRuc(String ruc) throws DAOExcepcion {
		System.out.println("empresaDAO: obtener(String ruc)");
		Empresa vo = new Empresa();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT id_empresa, id_contacto, razon_social, RUC, desc_negocio, " 
						  +"direccion, telefono, web, correo, estado, rubro FROM empresa WHERE estado = 1 and RUC = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, ruc);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setId_empresa(rs.getInt("id_empresa"));
				vo.setId_contacto(rs.getInt("id_contacto"));
				vo.setRazon_social(rs.getString("razon_social"));
				vo.setRUC(rs.getString("RUC"));
				vo.setDesc_negocio(rs.getString("desc_negocio"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setWeb(rs.getString("web"));
				vo.setCorreo(rs.getString("correo"));
				vo.setEstado(rs.getInt("estado"));
				vo.setRubro(rs.getString("rubro"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public void eliminar(String Ruc) throws DAOExcepcion {
		System.out.println("EmpresaDAO: eliminar(String Nombre)");
		String query = "update empresa set estado = 0 where RUC = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, Ruc);

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void actualizar(Empresa vo) throws DAOExcepcion {
		System.out.println("EmpresaDAO: actualizar(Empresa vo)");
		String query = "update empresa set razon_social = ?, desc_negocio = ?, direccion = ?, telefono = ?, web = ?, correo = ?, rubro = ? WHERE estado = 1 and RUC = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			stmt.setString(1, vo.getRazon_social());
			stmt.setString(2, vo.getDesc_negocio());
			stmt.setString(3, vo.getDireccion());
			stmt.setString(4, vo.getTelefono());
			stmt.setString(5, vo.getWeb());
			stmt.setString(6, vo.getCorreo());
			stmt.setString(7, vo.getRubro());
			stmt.setString(8, vo.getRUC());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<Empresa> listar() throws DAOExcepcion {
		System.out.println("EmpresaDAO: listar()");
		Collection<Empresa> c = new ArrayList<Empresa>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT id_empresa, id_contacto, razon_social, RUC, desc_negocio, direccion, " 
						  +"telefono, web, correo, estado, rubro " 
						  +"FROM empresa Where estado = 1";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Empresa vo = new Empresa();
				vo.setId_empresa(rs.getInt("id_empresa"));
				vo.setId_contacto(rs.getInt("id_contacto"));
				vo.setRazon_social(rs.getString("rason_social"));
				vo.setRUC(rs.getString("RUC"));
				vo.setDesc_negocio(rs.getString("desc_negocio"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setWeb(rs.getString("web"));
				vo.setCorreo(rs.getString("correo"));
				vo.setEstado(rs.getInt("estado"));
				vo.setRubro(rs.getString("rubro"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public ArrayList<Empresa> obtenerRubro(String rubro) throws DAOExcepcion {
		System.out.println("empresaDAO: obtener(String ruc)");
		ArrayList<Empresa> c = new ArrayList<Empresa>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT id_empresa, id_contacto, razon_social, RUC, desc_negocio, " 
						  +"direccion, telefono, web, correo, estado, rubro FROM empresa WHERE estado = 1 and rubro = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, rubro);
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Empresa vo = new Empresa();
				vo.setId_empresa(rs.getInt("id_empresa"));
				vo.setId_contacto(rs.getInt("id_contacto"));
				vo.setRazon_social(rs.getString("razon_social"));
				vo.setRUC(rs.getString("RUC"));
				vo.setDesc_negocio(rs.getString("desc_negocio"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setWeb(rs.getString("web"));
				vo.setCorreo(rs.getString("correo"));
				vo.setEstado(rs.getInt("estado"));
				vo.setRubro(rs.getString("rubro"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
}
